/*
 * code4adresses.h
 *
 *  Created on: 22 déc. 2011
 *      Author: arthur
 */

#ifndef CODE4ADRESSES_H_
#define CODE4ADRESSES_H_

#include "global.h"
#include "y.tab.h"
#include <stdlib.h>
#include <math.h>

enum instructionMIPS {
	add, addi, addu, addiu, divMIPS,//div est déja utilisé dans stdlib
	mul,
	mulo,
	mulou,
	rem,
	remu,
	sub,
	subu,
	and,
	andi,
	not,
	or,
	ori,
	xor,
	xori,
	rol,
	ror,
	sll,
	sllv,
	sra,
	srav,
	srl,
	srlv,
	seq,
	sge,
	sgeu,
	sgt,
	sgtu,
	sle,
	sleu,
	slt,
	slti,
	sltu,
	sltiu,
	sne,
	b,
	beq,
	bgez,
	bgezal,
	bgtz,
	blez,
	bltz,
	bltzal,
	bgt,
	blt,
	bne,
	bnez,
	beqz,
	j,
	jal,
	la,
	lw,
	li,
	sw,
	move,
	nop,
	label,
	syscall,
	liChaine
};

enum registres {
	r0 = 0,
	at = 1,
	v0 = 2,
	v1 = 3,
	a0 = 4,
	a1 = 5,
	a2 = 6,
	a3 = 7,
	t0 = 8,
	t1 = 9,
	t2 = 10,
	t3 = 11,
	t4 = 12,
	t5 = 13,
	t6 = 14,
	t7 = 15,
	s0 = 16,
	s1 = 17,
	s2 = 18,
	s3 = 19,
	s4 = 20,
	s5 = 21,
	s6 = 22,
	s7 = 23,
	t8 = 24,
	t9 = 25,
	k0 = 26,
	k1 = 27,
	gp0 = 28,
	gp1 = 29,
	s8 = 30,
	ra = 31
};



typedef struct code4adresses {
	char * label;//optionel
	enum instructionMIPS instruction;

	/* Les 3 bits de poids faible de typeArgs, sont utilisé pour determiné le type de l'argument
	 * 0 = valeur brute
	 * 1 = registre ou adresse en mémoire
	 */
	unsigned char typeArgs;

	//mettre, le numero de variable temporaire ou la valeur en cas de constante
	int arg1;
	int arg2;
	int arg3;

	struct code4adresses * precedent;
	struct code4adresses * suivant;
} code4adresses;

//liste des opérations

extern code4adresses * premiereOperation;
extern code4adresses * operationCourante;

//compteur des instruction POW (pour généré des labels uniques
extern int compteurPOW;

extern char * labelPremiereOp;

//dernière expression :
extern int derniereExpr;
extern int typrDerniereExpr;

int arg1estEcrit(enum instructionMIPS instr);
int nbArg(enum instructionMIPS instr);
int estUnSaut(enum instructionMIPS instr);
char * nomInstr(enum instructionMIPS instr);
char * nomReg(enum registres reg);
code4adresses * genCode(char * label, enum instructionMIPS op, int arg1,
		int arg2, int arg3, int typeArg1, int typeArg2, int typeArg3);
int genAff();
int genOpArithmetiqueOuBooleene(int opCourante);
int genOpArithmetiqueOuBooleeneParentheses();
#endif /* CODE4ADRESSES_H_ */
